package com.example.jasypt.cipher.generator;

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.iv.NoIvGenerator;

/**
 * Jasypt加密工具类
 * 提供与命令行工具org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI等效的加密功能
 */
public class JasyptEncryptionUtil {

    /**
     * 使用指定算法和密码加密字符串
     *
     * @param input 要加密的明文字符串
     * @param password 加密密码
     * @param algorithm 加密算法
     * @return 加密后的字符串
     */
    public static String encrypt(String input, String password, String algorithm) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setPassword(password);
        encryptor.setAlgorithm(algorithm);
        // 设置IV生成器，与命令行工具保持一致
        encryptor.setIvGenerator(new NoIvGenerator());
        return encryptor.encrypt(input);
    }

    /**
     * 使用默认配置加密字符串（PBEWithMD5AndDES算法）
     *
     * @param input 要加密的明文字符串
     * @param password 加密密码
     * @return 加密后的字符串
     */
    public static String encrypt(String input, String password) {
        return encrypt(input, password, "PBEWithMD5AndDES");
    }

    /**
     * 主方法，提供命令行使用方式
     *
     * @param args 命令行参数：input=明文 password=密码 algorithm=算法
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("使用方法: java JasyptEncryptionUtil input=\"明文\" password=密码 [algorithm=算法]");
            return;
        }

        String input = null;
        String password = null;
        String algorithm = "PBEWithMD5AndDES"; // 默认算法

        // 解析命令行参数
        for (String arg : args) {
            if (arg.startsWith("input=")) {
                input = arg.substring(6);
            } else if (arg.startsWith("password=")) {
                password = arg.substring(9);
            } else if (arg.startsWith("algorithm=")) {
                algorithm = arg.substring(10);
            }
        }

        if (input == null || password == null) {
            System.out.println("错误: 必须提供input和password参数");
            System.out.println("使用方法: java JasyptEncryptionUtil input=\"明文\" password=密码 [algorithm=算法]");
            return;
        }

        try {
            String encrypted = encrypt(input, password, algorithm);
            System.out.println("加密结果: " + encrypted);
        } catch (Exception e) {
            System.err.println("加密过程中发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
